home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / util / pack / OptXPK.lha / OptimizeXPK.rexx < prev   
OS/2 REXX Batch file  |  1995-02-24  |  4KB  |  189 lines

  1. /* OptimizeXPK.rexx */
  2.  
  3. OPTIONS RESULTS
  4.  
  5. /* Change this to reflect where you have the "xpk" program installed */
  6. XPK = "Arc:Xpk"
  7.  
  8. /* Change this to where you have GNU touch installed,    */
  9. /* or, if you don't have GNU touch -- or any other touch */
  10. /* that supports reference files via a "-r" switch as a  */
  11. /*command line argument, leave it blank, as in:          */
  12. /* TOUCH = "" */
  13. TOUCH = "bin:touch"
  14.  
  15. /* */
  16. packers.0 = 4
  17. packers.1 = "MASH"
  18. packers.2 = "IMPL"
  19. packers.3 = "RAKE"
  20. packers.4 = "NUKE"
  21.  
  22. /*********************************************/
  23. /* Don't change anything beyond this point,  */
  24. /* unless you really know what you're doing. */
  25. /*********************************************/
  26.  
  27. CALL ADDLIB("rexxsupport.library", 0, -30, 0)
  28.  
  29. SAY "Starting to optimize at" TIME(CIVIL)
  30. CALL TIME(RESET)
  31.  
  32. IF ARG(1,"Exists") THEN
  33.   DO
  34.     PARSE ARG msg
  35.     DO UNTIL msg=""
  36.         PARSE VAR msg first rest
  37.         msg=rest
  38.         CALL OptimizeDir(first)
  39.     END
  40.   END
  41. ELSE
  42.   DO
  43.     CALL ADDLIB("rexxreqtools.library", 0, -30, 0)
  44.     CALL RTFILEREQUEST("", , "Pick files to pack", "_Pack", 'rtfi_flags = freqf_multiselect',files)
  45.     IF files == 1 THEN
  46.       DO j=1 TO files.count
  47.         CALL OptimizeDir(files.j)
  48.       END
  49.   END
  50.  
  51. secs=TIME(ELAPSED)
  52. SAY "Done at" TIME(CIVIL)
  53. SAY "Time elapsed:" secs"s"
  54.  
  55. EXIT 0
  56.  
  57.  
  58. /********** OptimizeDir **********/
  59. OptimizeDir: PROCEDURE EXPOSE XPK packers.
  60. PARSE ARG filepath
  61.  
  62. filestats = STATEF(filepath)
  63. PARSE VAR filestats filetype .
  64. IF filetype="FILE" THEN
  65.   DO
  66.     CALL OptimizeFile(filepath)
  67.   END
  68. ELSE IF filetype="DIR" THEN
  69.   DO
  70.     filelist = SHOWDIR(filepath,'FILE','0a'x)
  71.     IF LENGTH(filelist)>0 THEN CALL OptimizeDir_Helper(filepath,filelist)
  72.     filelist = SHOWDIR(filepath,'DIR','0a'x)
  73.     IF LENGTH(filelist)>0 THEN CALL OptimizeDir_Helper(filepath,filelist)
  74.   END
  75.  
  76. RETURN 0
  77.  
  78.  
  79. /********** OptimizeDir_Helper **********/
  80. OptimizeDir_Helper: PROCEDURE EXPOSE XPK packers.
  81. PARSE ARG pathname,filelist
  82.  
  83. DO UNTIL filelist=""
  84.     PARSE VAR filelist first '0a'x rest
  85.     filelist=rest
  86.     testchar = RIGHT(pathname,1)
  87.     IF testchar==":" | testchar=="/" THEN
  88.         filepath = pathname||first
  89.     ELSE
  90.         filepath = pathname"/"first
  91.     CALL OptimizeDir(filepath)
  92. END
  93.  
  94. RETURN 0
  95.  
  96.  
  97. /********** OptimizeFile **********/
  98. OptimizeFile: PROCEDURE EXPOSE XPK packers.
  99. PARSE ARG filepath
  100.  
  101. divpos   = MAX(LASTPOS(":", filepath), LASTPOS("/", filepath)) + 1
  102. filename = SUBSTR(filepath, divpos)
  103. tmpdir   = "OptXPK:_"filename
  104. original = tmpdir"/original"
  105.  
  106. ADDRESS COMMAND
  107. 'makedir' tmpdir
  108.  
  109. 'copy' filepath original
  110. XPK '>NIL:' '-e' original
  111.  
  112. filestats = STATEF(original)
  113. PARSE VAR filestats . bytes blocks .
  114.  
  115. best.name  = "original"
  116. best.size  = blocks
  117. best.bytes = bytes
  118. best.time  = 0
  119. SAY filepath "["blocks" blocks] "
  120.  
  121. IF blocks>1 THEN
  122. DO i = 1 to packers.0
  123.     this = tmpdir"/"packers.i
  124.     'copy' original this
  125.     XPK '>NIL: -m' packers.i this
  126.     filestats = STATEF(this)
  127.     PARSE VAR filestats . bytes blocks .
  128.     CALL WRITECH(STDOUT, packers.i "["blocks"] ")
  129.     IF blocks < best.size THEN
  130.       DO
  131.         IF best.name~="original" THEN 'delete quiet' tmpdir"/"best.name
  132.         best.name  = packers.i
  133.         best.size  = blocks
  134.         best.bytes = bytes
  135.         best.time  = ExtractionTime(this)
  136.       END
  137.     ELSE IF blocks = best.size THEN
  138.       DO
  139.         challenge = ExtractionTime(this)
  140.         IF best.time < challenge THEN
  141.           DO
  142.             'delete quiet' this
  143.           END
  144.         ELSE
  145.           DO
  146.             IF best.name~="original" THEN 'delete quiet' tmpdir"/"best.name
  147.             best.name = packers.i
  148.             best.bytes= bytes
  149.             best.time = challenge
  150.           END
  151.       END
  152.     ELSE
  153.       DO
  154.         'delete quiet' this
  155.       END
  156. END
  157.  
  158. filestats = STATEF(filepath)
  159. PARSE VAR filestats . bytes blocks .
  160.  
  161. IF best.size<=blocks THEN
  162.   DO
  163.     SAY "("best.name")"
  164.     dest = tmpdir"/"best.name
  165.     IF touch~="" THEN touch "-r" filepath dest
  166.     'copy dates' dest filepath
  167.   END
  168. ELSE
  169.     SAY "()"
  170.  
  171. 'delete quiet all' tmpdir
  172.  
  173. RETURN 0
  174.  
  175.  
  176. /********** ExtractionTime **********/
  177. ExtractionTime: PROCEDURE EXPOSE XPK tmpdir
  178. PARSE ARG xpkfile
  179. time_me = tmpdir"/time_me"
  180. 'copy' xpkfile time_me
  181. CALL TIME(RESET)
  182. XPK ">NIL:" '-e' time_me
  183. te = TIME(ELAPSED)
  184. 'delete quiet' time_me
  185. CALL WRITECH(STDOUT, "«"te"s» ")
  186. PARSE VAR te secs "." jiffies .
  187. RETURN 100 * secs + jiffies
  188.  
  189.